package com.ftg.learn.rbac.service.impl;

import com.ftg.learn.rbac.entity.Permission;
import com.ftg.learn.rbac.mapper.PermissionMapper;
import com.ftg.learn.rbac.service.IPermissionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ftg.learn.rbac.vo.PermissionVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Guobt
 * @since 2022-02-09
 */
@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements IPermissionService {

    @Resource
    PermissionMapper permissionMapper;

    /**
     * 查询当前用户的权限
     * @param uid
     * @return
     */
    @Override
    public List<PermissionVo> showPermissionForUserId(String uid) {
            return permissionMapper.showPermissionForUserId(uid);
    }


    /**
     * 分级查询当前用户的权限
     * @param uid
     * @return
     */
    @Override
    public List<PermissionVo> queryPermission(String uid){
        List<PermissionVo> target = new ArrayList<>();
        // 查询出的数据
        List<PermissionVo> list = this.showPermissionForUserId(uid);
        createTree(target,list,-1);
        return target;
    }

    /**
     * 是不是应该把 pid 当做一个条件
     *      判断 pid 是否有子项
     *         list 里面有元素的parentid = pid 有
     *         。。。parentid所在这个元素添到pid childlist
     *         递归 pid
     *         return ;
     * @param pid 数据主键
     * @param target 目标
     * @param data 源数据
     * @return
     * pid -1
     */
    public void createTree(List<PermissionVo> target,List<PermissionVo> data,int pid) {
        if(findSon(data,pid)){
            data.forEach(x->{
                if(x.getParentId() == pid){
                    //一定要把x扔进去
                    PermissionVo parent = findParent(data,x);
                    if(parent == null){
                        target.add(x);// 把-1添加到的target  x.getPid();
                    }else{
                        parent.getChildList().add(x);
                    }
//                    data.remove(x);// 有可能会有问题
                    createTree(target,data,x.getPid());
                }
            });
        }
    }

    /**
     * 找子项
     * @param data 源数据
     * @param pid  主键 --- pid与parentId相同
     * @return
     */
    public boolean findSon(List<PermissionVo> data,int pid){
        return data.stream().anyMatch(x -> x.getParentId() == pid);
    }

    /**
     * 是不是存sno在 target里面是否有父亲,修改成递归 childList == null
     * @param data 父亲的所有元素
     * @param son    子元素
     * @return
     */
    public PermissionVo findParent(List<PermissionVo> data,PermissionVo son){
        for (PermissionVo permissionVo : data) {
            if(permissionVo.getPid().equals(son.getParentId())){
                return permissionVo;
            } else{
                findParent(permissionVo.getChildList(),son);
            }
        }
        return null;
    }



}
